package com.ppch.zerocodegenerator.service;

import cn.hutool.core.bean.BeanUtil;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.ppch.zerocodegenerator.exception.BusinessException;
import com.ppch.zerocodegenerator.exception.ErrorCode;
import com.ppch.zerocodegenerator.model.dto.app.AppQueryRequest;
import com.ppch.zerocodegenerator.model.entity.App;
import com.ppch.zerocodegenerator.model.entity.User;
import com.ppch.zerocodegenerator.model.vo.AppVO;
import com.ppch.zerocodegenerator.model.vo.UserVO;
import reactor.core.publisher.Flux;

import java.util.List;
import java.util.Map;

/**
 * 应用 服务层。
 *
 * @author 泡泡茶壶
 * @since 2025-10-5
 */
public interface AppService extends IService<App> {

    AppVO getAppVO(App app);

    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 根据用户Prompt以及应用ID调用AI生成/修改代码。
     * @param appId 应用ID
     * @param message 用户Prompt
     * @param loginUser 当前登录用户
     * @return Flux<String> 代码生成结果流
     */
    Flux<String> chatToGenCode(Long appId, String message, User loginUser);

    String deployApp(Long appId, User loginUser);

    /**
     * 异步生成应用截图并更新封面
     *
     * @param appId  应用ID
     * @param appUrl 应用访问URL
     */
    void generateAppScreenshotAsync(Long appId, String appUrl);

    /**
     * 判断用户输入Prompt与示例应用Prompt是否完全一致，如果一致则返回示例应用的appId，否则返回 0
     * @param userPrompt 用户输入Prompt
     * @return 一致：示例应用的appId，否则返回 0
     */
    Long isWhetherConsistentPrompt(String userPrompt);

    /**
     * 根据示例应用的appId、新应用的appId、当前登录用户，复制示例应用的代码文件、对话历史，
     * 并将示例应用的AI回复返回给前端，无需进入 AI 代码生成。
     * @param exampleApplicationAppId 示例应用的appId
     * @param newAppId 新应用的appId
     * @param loginUser 当前登录用户
     * @return AI 回复（示例应用的 AI 回复）
     */
    String copyCodeFileAndHistory(Long exampleApplicationAppId,Long newAppId,User loginUser);
}
